package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型的元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(7,6));
        list.add(new Point(13,8));
        list.add(new Point(99,77));
        list.add(new Point(4,3));
        list.add(new Point(1,2));
        list.add(new Point(66,34));
        System.out.println(list);
        /*
            Collections.sort(List list)
            该方法在对集合进行自然排序时，要求集合元素必须实现Comparable接口,否则编译
            不通过。
            Comparable接口是可比较接口，实现该接口就必须重写方法compareTo,用来定义元素
            之间的比较大小规则。

            当我们使用该方法排序时编译出错(元素没有实现Comparable)时，我们就不使用该方法了
            因为它对我们的程序产生了侵入性。
            侵入性:
            当我们调用某个API的方法时，该方法反过来还要求我们为其修改其他额外代码时，这就
            产生了侵入性，它不利于代码的后期维护，应当尽量避免。
         */
//        Collections.sort(list);
        /*
            重载的sort(List list,Comparator com)方法，要求我们传入一个比较器(相当于
            临时为集合元素提供一种比较规则)，然后根据比较器的比较规则比较集合元素的大小后
            进行排序

            实现Comparator比较器接口后必须重写方法:compare
            该方法的作用是定义参数o1与o2比较大小的规则，返回值用来表示o1与o2的大小关系
            当判定o1>o2时，方法应当返回一个大于0的数
            当判定o1<o2时，方法应当返回一个小于0的数
            当判定o1=o2时，方法应当返回0
         */
        Comparator<Point> com = new Comparator<Point>() {
            public int compare(Point o1, Point o2) {
                //判断标准:点到原点的距离长的大
                int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int olen2 = o2.getX()* o2.getX()+o2.getY()* o2.getY();
//                return olen1-olen2;
                //两个值反过来减就是降序(从大到小)
                return olen2-olen1;

            }
        };
        /*
            java有23种设计模式
            图解设计模式
            thinking in java java编程思想

            当我们调用一个方法时传入了一段代码(通常传入一个实例并是实现某个接口，
            然后重写了该接口中的相应方法，但是该实例的这些方法我们不会主动调用)
            该方法在执行过程中会反过来调用我们传入的代码,这个过程就是回调模式。
         */
        Collections.sort(list,com);

        System.out.println(list);
    }
}
